package cn.kgc.springmvc.controller;

import cn.kgc.springmvc.util.ResponseResult;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 课工场
 * @date 2024/2/28
 * @description  控制层方法的返回值可以是什么类型
 *    1.String    视图名  视图解析器的解析    /hello.jsp  转发
 *    2.ModelAndView
 *    3.ResponseResult  ->  json
 *    4.void
 *
 * 在控制层中如果所有的方法全部以json格式的数据进行响应 那么可以在类上添加注解
 *   1. @Controller  @ResponseBody
 *   2. @RestController  =   @Controller +  @ResponseBody
 */
@Controller
@RequestMapping("user")
// @ResponseBody    //  注解加载类上  当前类中的所有方法的返回值全部会被转换成json进行返回
// @RestController
public class UserController {


    @RequestMapping("m1")
    public String method1(HttpServletRequest request) {
        request.setAttribute("info","hello world");
        return "hello";
    }


    //  页面转发时需要携带数据 可以在方法中设置一个Model类型的形式参数 实现数据的封装
    @RequestMapping("m2")
    public String method2(Model model) {
        model.addAttribute("info","hello model");
        return "hello";
    }

    /**
     *  返回值的类型是ModelAndView类型  可以将返回值和视图名封装成ModelAndView
     *  如何实现视图的跳转     转发   封装在 ModelAndView中的值在经过视图解析器的解析之后会存如 request对象
     */
    @RequestMapping("m3")
    public ModelAndView method3() {

        ModelAndView modelAndView = new ModelAndView();
        // 设置视图名
        modelAndView.setViewName("hello");
        // 添加数据
        modelAndView.addObject("info","hello modelAndView");
        return modelAndView;
    }


    @RequestMapping("m4")
    @ResponseBody   // 声明返回的结果 需要转换成json格式之后响应给前端浏览器
    public ResponseResult method4() {

        ResponseResult responseResult = new ResponseResult();
        responseResult.setCode(0);
        responseResult.setMessage("请求成功");

        return responseResult;
    }

}
